home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue62 / outlook / OutlookHelper / PipeServer.pas < prev   
Encoding:
Pascal/Delphi Source File  |  2000-08-12  |  5.0 KB  |  149 lines

  1. unit PipeServer;
  2.  
  3. interface
  4.  
  5. Uses
  6.   Classes, Outlook;
  7.  
  8. Const
  9.   strPipeName = '\\.\pipe\weblook_tdm_version_1';
  10.  
  11. Type
  12.   TPipeServerThread = Class(TThread)
  13.   Protected
  14.     strMessage : String;
  15.     Procedure LogMessage;
  16.     Function ProcessPipeRequest(strRequest : String) : String;
  17.     Function GetCalendarResponse(strDate : String) : String;
  18.     Function GetContactResponse(strIndex : String) : String;
  19.     Function GetTaskResponse(strIndex : String) : String;
  20.     Function GetNoteResponse(strIndex : String) : String;
  21.     Function GetInboxResponse(strIndex : String) : String;
  22.   Public
  23.     ooOutlook : TOutlookObjects;
  24.     Procedure Execute; Override;
  25.   End;
  26.  
  27. implementation
  28.  
  29. Uses Windows,SysUtils,MainForm,ActiveX;
  30.  
  31. Procedure TPipeServerThread.Execute;
  32. Var
  33.   hPipe       : THandle;
  34.   bConnected  : Boolean;
  35.   cRequest    : Array[0..1024-1] of Char; { 1kB }
  36.   iBR,iBW     : Cardinal; { bytes read, bytes written }
  37.   strResponse : String;
  38.  
  39. Begin
  40.   hPipe := CreateNamedPipe(strPipeName,Pipe_Access_Duplex,Pipe_Type_Byte Or Pipe_Wait,1,
  41.                            4096,4096,nmpWait_Use_Default_Wait,nil);
  42.   If (hPipe = Invalid_Handle_Value) Then Begin
  43.     strMessage := 'Cannot create pipe: '+SysErrorMessage(GetLastError);
  44.     Synchronize(LogMessage);
  45.     Exit;
  46.   End;
  47.   CoInitialize(nil);
  48.   While (Not Terminated) do Begin
  49.     bConnected := ConnectNamedPipe(hPipe,nil);
  50.     If ((Not bConnected) And (GetLastError = Error_Pipe_Connected)) Then
  51.       bConnected := True; { if a client connected between the CreatePipe and ConnectPipe calls }
  52.     If bConnected Then Begin
  53.       If (Not ReadFile(hPipe,cRequest,SizeOf(cRequest),iBR,nil)) Then Begin
  54.         strMessage := 'Cannot read from pipe: '+SysErrorMessage(GetLastError);
  55.         Synchronize(LogMessage);
  56.       End
  57.       Else Begin
  58.         cRequest[iBR] := #0; { properly terminate the string }
  59.         strMessage := 'Got request "'+cRequest+'"';
  60.         Synchronize(LogMessage);
  61.         If (cRequest = 'FREE') Then Begin
  62.           strMessage := 'Freeing Outlook objects';
  63.           Synchronize(LogMessage);
  64.           ooOutlook.Free;
  65.         End
  66.         Else Begin
  67.           strResponse := ProcessPipeRequest(cRequest);
  68.           strMessage := 'Responding "'+strResponse+'"';
  69.           Synchronize(LogMessage);
  70.           WriteFile(hPipe,Pointer(strResponse)^,Length(strResponse),iBW,nil);
  71.           FlushFileBuffers(hPipe); { make sure data written actually gets to the client }
  72.         End;
  73.         DisconnectNamedPipe(hPipe);
  74.       End;
  75.     End;
  76.   End;
  77.   CloseHandle(hPipe);
  78.   CoUninitialize;
  79.   strMessage := 'Pipe thread terminated';
  80.   Synchronize(LogMessage);
  81. End;
  82.  
  83. Procedure TPipeServerThread.LogMessage;
  84. Begin
  85.   HelperMainForm.LogMessage(strMessage);
  86. End;
  87.  
  88. Function TPipeServerThread.ProcessPipeRequest(strRequest : String) : String;
  89. Var
  90.   iPos     : Integer;
  91.   strVerb  : String;
  92.   strParam : String;
  93.  
  94. Begin
  95.   { extract the words from the request (verb & param) }
  96.   iPos := Pos(' ',strRequest);
  97.   strVerb := Copy(strRequest,1,iPos-1);
  98.   strParam := Copy(strRequest,iPos+1,Length(strRequest)-iPos);
  99.   { check what to do with the verb }
  100.   Try
  101.     If HelperMainForm.HelperActive.Checked Then Begin
  102.       { if the "Active" checkbox on the mainform is checked }
  103.       If (ooOutlook = nil) Then ooOutlook := TOutlookObjects.Create;
  104.       If (strVerb = 'CALENDAR') Then Result := GetCalendarResponse(strParam)
  105.       Else If (strVerb = 'CONTACT') Then Result := GetContactResponse(strParam)
  106.       Else If (strVerb = 'TASK') Then Result := GetTaskResponse(strParam)
  107.       Else If (strVerb = 'NOTE') Then Result := GetNoteResponse(strParam)
  108.       Else If (strVerb = 'INBOX') Then Result := GetInboxResponse(strParam)
  109.       Else Result := 'Unknown verb.';
  110.     End
  111.     Else Result := 'Helper application not active';
  112.   Except
  113.     On E : Exception do Result := E.Message;
  114.   End;
  115. End;
  116.  
  117. Function TPipeServerThread.GetCalendarResponse(strDate : String) : String;
  118. Var wY,wM,wD : Word;
  119. Begin
  120.   DecodeDate(StrToInt(strDate),wY,wM,wD);
  121.   Result := ooOutlook.GetAppointmentsOn(wY,wM,wD)+'<BR>';
  122. End;
  123.  
  124. Function TPipeServerThread.GetContactResponse(strIndex : String) : String;
  125. Begin
  126.   If (strIndex = 'COUNT') Then Result := IntToStr(ooOutlook.GetContactCount)
  127.   Else Result := ooOutlook.GetContactDetails(StrToInt(strIndex));
  128. End;
  129.  
  130. Function TPipeServerThread.GetTaskResponse(strIndex : String) : String;
  131. Begin
  132.   If (strIndex = 'COUNT') Then Result := IntToStr(ooOutlook.GetTaskCount)
  133.   Else Result := ooOutlook.GetTaskDetails(StrToInt(strIndex));
  134. End;
  135.  
  136. Function TPipeServerThread.GetNoteResponse(strIndex : String) : String;
  137. Begin
  138.   If (strIndex = 'COUNT') Then Result := IntToStr(ooOutlook.GetNoteCount)
  139.   Else Result := ooOutlook.GetNoteDetails(StrToInt(strIndex));
  140. End;
  141.  
  142. Function TPipeServerThread.GetInboxResponse(strIndex : String) : String;
  143. Begin
  144.   If (strIndex = 'COUNT') Then Result := IntToStr(ooOutlook.GetInboxMessageCount)
  145.   Else Result := ooOutlook.GetInboxMessageDetails(StrToInt(strIndex));
  146. End;
  147.  
  148. end.
  149.